package day0610

import scala.reflect.ClassTag

/**
  * @program: hadoop
  * @description: 泛型类
  * @author: Qiang.Ye
  * @date: 2019-06-12 06:37
  *
  *  泛型类：定义类的时候，可以带一个泛型的参数（和JAVA类型）
  *  泛型函数：定义函数的时候，可以带有一个泛型的参数
  **/

//定义一个类用于操作Int
class GenericClassInt{

  private   var content : Int = 10

  //定义set，get方法
  def set(value: Int) = {content = value}
  def get() = {content }
}
//定义一个类用于操作String
class GenericClassString{

  private   var content : String = "hello"

  //定义set，get方法
  def set(value: String) = {content = value}
  def get() = {content }
}

/**
  * 上面2个类非常相像
  * 考虑：封装，泛型
  *
  * 使用泛型：
  * 能不能定义一个类，既可以操作整数，也可以操作字符串？
  * 定义一个泛型类
  *
  */
class GenericClass[T]{
  private   var content : T = _ //注意：初始值用_表示

  //定义set，get方法
  def set(value: T) = {content = value}
  def get() = {content }
}

object GenericClass {

  def main(args: Array[String]): Unit = {
      var v1 = new GenericClass[Int] //相当于GenericCalssInt
      v1.set(1000)
      println(v1.get())

    //定义一个String
    var v2 = new GenericClass[String]
    v2.set("zhangsan")
    println(v2.get())

    /**
      * 定义泛型函数
      */
    //    scala> def mkIntArray(elem:Int*) = Array[Int](elem:_*)
//    mkIntArray: (elem: Int*)Array[Int]
//    scala> mkIntArray(1,2,3)
//    res0: Array[Int] = Array(1, 2, 3)
//    scala> def mkArray[T:ClassTag](elem:T*) = Array[T](elem:_*)
//      <console>:11: error: not found: type ClassTag
//      def mkArray[T:ClassTag](elem:T*) = Array[T](elem:_*)
//      <console>:11: error: No ClassTag available for T
//        def mkArray[T:ClassTag](elem:T*) = Array[T](elem:_*)
//        scala> import scala.reflect.ClassTag
//        import scala.reflect.ClassTag
//        scala> def mkArray[T:ClassTag](elem:T*) = Array[T](elem:_*)
//        mkArray: [T](elem: T*)(implicit evidence$1: scala.reflect.ClassTag[T])Array[T]
       def mkIntArray(elem:Int*) = Array[Int](elem:_*)
       println(mkIntArray(1,3,5,6,2))
       def mkStringArray(elem:String*) = Array[String](elem:_*)
       println(mkStringArray("a","b","c"))
      import scala.reflect.ClassTag //使用此种情景必须引入此包
       def mkTArray[T:ClassTag](elem:T*) = Array[T](elem:_*)
       println(mkTArray(1,2,3,5,9))
       println(mkTArray("c","f","e","g"))




  }

}
